package com.plc.demo.service;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 地址生成服务
 */
@Service
public class AddressService {

    /**
     * 生成地址列表
     * 
     * @param addressType 地址类型，如 "VW"
     * @param startValue 起始值
     * @param endValue 终止值
     * @param increment 增量
     * @return 地址列表，每个地址格式为 "类型 地址"
     */
    public List<String> generateAddresses(String addressType, int startValue, int endValue, int increment) {
        List<String> addresses = new ArrayList<>();
        
        for (int i = startValue; i <= endValue; i += increment) {
            addresses.add(addressType + " " + i);
        }
        
        return addresses;
    }

    /**
     * 生成开关地址列表
     * 格式：{addressType} 主地址.子地址，其中主地址0~31，子地址0~7
     *
     * @param addressType 地址类型，如 "IB"
     * @return 开关地址列表
     */
    public List<String> generateSwitchAddresses(String addressType) {
        List<String> addresses = new ArrayList<>();
        for (int main = 0; main <= 31; main++) {
            for (int sub = 0; sub <= 7; sub++) {
                addresses.add(addressType + " " + main + "." + sub);
            }
        }
        return addresses;
    }

    /**
     * 将地址列表按指定大小分组
     * 
     * @param addresses 地址列表
     * @param batchSize 每组的数量
     * @return 分组后的地址列表
     */
    public List<List<String>> batchAddresses(List<String> addresses, int batchSize) {
        List<List<String>> batches = new ArrayList<>();
        
        for (int i = 0; i < addresses.size(); i += batchSize) {
            int end = Math.min(i + batchSize, addresses.size());
            batches.add(addresses.subList(i, end));
        }
        
        return batches;
    }

    /**
     * 将地址列表转换为逗号分隔的字符串
     * 
     * @param addresses 地址列表
     * @return 逗号分隔的地址字符串
     */
    public String addressesToString(List<String> addresses) {
        return String.join(",", addresses);
    }

    /**
     * 将地址列表转换为指定格式的字符串
     * 格式：地址类型 地址1,地址2,地址3...
     * 例如：VD VD1484,VD1488,VD1492,VD1496
     * 
     * @param addresses 地址列表，格式为 "类型 地址"
     * @return 格式化后的地址字符串
     */
    public String addressesToFormattedString(List<String> addresses) {
        if (addresses == null || addresses.isEmpty()) {
            return "";
        }
        
        // 提取地址类型（从第一个地址中提取）
        String firstAddress = addresses.get(0);
        String addressType = firstAddress.split(" ")[0];
        
        // 提取所有地址的数值部分，并添加类型前缀
        List<String> formattedAddresses = new ArrayList<>();
        for (String address : addresses) {
            String[] parts = address.split(" ");
            if (parts.length >= 2) {
                // 格式：地址类型+数值，例如 VD1484
                formattedAddresses.add(addressType + parts[1]);
            } else if (address.startsWith(addressType)) {
                // 如果地址已经包含类型前缀，直接使用
                formattedAddresses.add(address);
            }
        }
        
        // 格式：地址类型 地址1,地址2,地址3...
        return addressType + " " + String.join(",", formattedAddresses);
    }
}

